home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_074
/
tdebug
/
tdebug.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
6KB
|
251 lines
/*
* TDEBUG.C
*
* (C)Copyright 1987 Matthew Dillon, All Rights Reserved
* FreeWare. May be distributed for non-profit only.
*
* Debug any device .. usually trackdisk.device
*
* AZTEC USERS: MUST COMPILE +CDL and LINK WITH THE LARGE EVERYTHING
* LIBRARY!!!! (cl32.lib). NOTE: This source expects all the amiga
* symbols to be preloaded. NOTE: There are some function calls in this
* source which you don't have... the functions should be obvious and
* easy to implement.
*
* Sorry, no support for lattice. A smart programmable will be able to
* split the assembly file and do all the right #includes.
*
*/
#define FIFO struct _FIFO
typedef struct ExecBase EB;
typedef struct List LIST;
typedef struct Node NODE;
typedef struct IOStdReq STD;
typedef struct Task TASK;
FIFO {
FIFO *next; /* next element */
STD std; /* IO request */
};
extern EB *SysBase;
extern NODE *findlist();
extern TASK *FindTask();
extern char *AllocMem();
FIFO *Base, **Lnext = &Base;
NODE *Nodearray[64];
NODE *Ntrack;
NODE *Nasdg;
TASK *Mastertask;
long Operations; /* # operations monitored */
long Mask, Signum;
char *Stdname[] = {
"INVALID", "RESET", "READ", "WRITE", "UPDATE", "CLEAR", "STOP",
"START", "FLUSH"
};
main(ac, av)
char *av[];
{
register FIFO *fifo;
register long result;
disablebreak();
Mastertask = FindTask(0);
Signum = AllocSignal(-1);
Mask = 1 << Signum;
loadnodearray(ac, av); /* which devices to intercept? */
overidevector(1);
puts ("Now intercepting all DoIO() and SendIO() operations");
puts ("");
puts ("Device__ Cmd_ Len_____");
SetSignal(0, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D);
for (;;) {
result = Wait(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|Mask);
if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D))
break;
while (Base) {
long block, cmd;
char ext;
Forbid();
fifo = Base;
Base = Base->next;
if (Base == NULL)
Lnext = &Base;
Permit();
printf ("%16s ", fifo->std.io_Device->dd_Library.lib_Node.ln_Name);
cmd = fifo->std.io_Command;
ext = ' ';
if (cmd & TDF_EXTCOM) {
cmd &= ~TDF_EXTCOM;
ext = 'E';
}
if (fifo->std.io_Command < CMD_NONSTD)
printf ("%lc%-7s ", ext, Stdname[fifo->std.io_Command]);
else
printf (" NON+%lc%-2ld ", ext, fifo->std.io_Command - CMD_NONSTD);
printf ("%-8ld %-8ld ", fifo->std.io_Length, fifo->std.io_Offset);
if (fifo->std.io_Device == Ntrack || fifo->std.io_Device == Nasdg) {
block = fifo->std.io_Offset / 512;
printf ("Blk#: %-5ld ", block);
printf ("(Trk %2ld Cyl %2ld) ", block/22, (block/11)&1);
}
puts("");
FreeMem(fifo, sizeof(*fifo));
}
}
puts ("Restoring intercept vector");
overidevector(0);
Delay(50);
while (Base) {
fifo = Base->next;
FreeMem(Base, sizeof(*Base));
Base = fifo;
}
FreeSignal(Signum);
printf ("%ld operations monitored\n", Operations);
}
loadnodearray(ac, av)
char *av[];
{
register int i;
register int j;
register NODE *node;
register LIST *list = &SysBase->DeviceList;
Ntrack = findlist(list, "trackdisk.device");
Nasdg = findlist(list, "asdg.vdisk.device");
if (ac == 1) {
puts ("TDEBUG V1.00 By Matthew Dillon");
puts ("(C)Copyright 1987 Mathew Dillon, All Rights Reserved");
puts ("CTRL-C, CTRL-D, or BREAK to terminate");
puts ("");
puts ("tdebug device device...");
puts ("tdebug trackdisk.device");
puts ("");
showlist(list);
puts ("");
exit(1);
}
for (i = 1, j = 0; av[i]; ++i) {
node = findlist(list, av[i]);
if (!node)
printf ("Unable to find: %s\n", av[i]);
else
Nodearray[j++] = node;
}
}
NODE *
findlist(list, name)
LIST *list;
char *name;
{
register NODE *node;
for (node = list->lh_Head; node != &list->lh_Tail; node = node->ln_Succ) {
if (strcmp(name, node->ln_Name) == 0)
return(node);
}
return(NULL);
}
showlist(list)
LIST *list;
{
register NODE *node;
for (node=list->lh_Head; node != &list->lh_Tail; node=node->ln_Succ) {
puts(node->ln_Name);
}
}
static long oldsendvec;
static long olddovec;
overidevector(n)
{
extern char LVODoIO;
extern char LVOSendIO;
extern int newsendio(), newdoio();
Forbid();
if (n) {
oldsendvec = SetFunction(SysBase, &LVOSendIO, newsendio);
olddovec = SetFunction(SysBase, &LVODoIO, newdoio);
} else {
SetFunction(SysBase, &LVOSendIO, oldsendvec);
SetFunction(SysBase, &LVODoIO, olddovec);
}
Permit();
}
/*
* NOTE!!! Since BeginIO is the basis for the entire operating system,
* we cannot do anything inside this routine that would ever use it.
*/
myio(ioreq)
register STD *ioreq;
{
register FIFO *fifo;
register int i;
Forbid();
for (i = 0; Nodearray[i]; ++i) {
if (Nodearray[i] == ioreq->io_Device)
break;
}
if (Nodearray[i]) {
if (fifo = (FIFO *)AllocMem(sizeof(*fifo), 0)) {
*Lnext = fifo;
Lnext = &fifo->next;
fifo->next = NULL;
fifo->std = *ioreq;
}
++Operations;
Signal(Mastertask, Mask);
}
Permit();
}
#asm
_newsendio:
movem.l D0-D7/A0-A6,-(sp) ;save regs
move.l A1,-(sp) ;the io request
jsr _myio ;call my intercept routine
addq.l #4,sp
movem.l (sp)+,D0-D7/A0-A6 ;restore regs
move.l _oldsendvec,A0 ;A0 not used by SendIO
jsr (A0)
rts
_newdoio:
movem.l D0-D7/A0-A6,-(sp) ;save regs
move.l A1,-(sp) ;the io request
jsr _myio ;call my intercept routine
addq.l #4,sp
movem.l (sp)+,D0-D7/A0-A6 ;restore regs
move.l _olddovec,A0 ;A0 not used by SendIO
jsr (A0)
rts
#endasm